package com.kl.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement //必须要开启事务管理才能让分页插件生效
@Configuration
@MapperScan("com.kl.dao") //一定要指定dao接口所在的包
public class MybatisPlusConfig {

    /**
     * 乐观锁插件说明：
     * <p>
     * 乐观锁的实现原理(@Version 标注的实体字段用于实现乐观锁) :
     * 取出记录时，获取当前 version
     * 更新时，带上这个version
     * 执行更新时，set version = yourVersion+1 where version = yourVersion
     * 如果 version不对，就更新失败
     *
     * 分页插件说明：
     * 使用分页查询必须设置mybatis-plus提供的分页插件,才能实现分页效果
     * 生成一个分页拦截器对象才能真正的实现分页的效果
     * 在分页查询时时通过拦截器拦截来实现分页效果
     * 注意事项:目前分页查询仅仅支持单表查询,不能在表连接时使用分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        // 注册乐观锁插件
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        // 注册分页插件
        // DbType：数据库类型(根据类型获取应使用的分页方言)
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}
